﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using Servidor.Xml;
using Servidor.Dominio;

namespace Servidor
{
    public class servidor
    {
        TcpListener tcpListener;


        public void encender()
        {
            tcpListener = new TcpListener(7892);
            Console.WriteLine("Servidor");
            Console.WriteLine("ESPERANDO UN CLIENTE");
        }

        public String quitarAsteriscos(String cadena) {
            int asterisco = cadena.IndexOf("*");
            if (asterisco >= 0)
                cadena = cadena.Substring(0, asterisco);
            return cadena;
        }

        public Boolean validarTarjeta(String peticion)
        {
            String nroTarjeta = peticion.Substring(10, 10);
            String clave = peticion.Substring(0, 10);
            clave = quitarAsteriscos(clave);
                   
            Tarjeta tarjeta = Datos.buscarTarjeta(peticion);
            if (tarjeta != null)
            {
                if (tarjeta.Clave.Equals(clave) && tarjeta.Numero.Equals(nroTarjeta))
                    return true;
            }
            return false;
        }


        public void cambiarClave(String peticion)
        {
           
            Tarjeta tarjeta = Datos.buscarTarjeta(peticion);
            peticion = peticion.Substring(0,10);
            tarjeta.Clave = quitarAsteriscos(peticion);
            Datos.reemplazar(tarjeta);
       
        }

        public String informacionCuentas(String peticion)
        {
            String infoCuentas = "";
            Tarjeta tarjeta = Datos.buscarTarjeta(peticion);
            List<Cuenta> cuentas = tarjeta.Cuentas;
            foreach (Cuenta c in cuentas)
            {
                infoCuentas = infoCuentas + c.Numero + c.Tipo + c.Saldo + ":";
            }
            return infoCuentas;
        }


        public void escuchar()
        {

            while (1 == 1)
            {
                tcpListener.Start();
                Socket socketParaCliente = tcpListener.AcceptSocket();
                if (socketParaCliente.Connected)
                {
                    Console.WriteLine("se ha conectado un cliente");

                    NetworkStream networkStream = new NetworkStream(socketParaCliente);

                    StreamReader streamReader = new StreamReader(networkStream);

                    StreamWriter streamWriter = new StreamWriter(networkStream);


                    try
                    {
                        String peticion = streamReader.ReadLine();
                        
                        String operacion = peticion.Substring(0,1);
                        peticion = peticion.Substring(1,20);

                        if (operacion == "L")
                        {
                            if (Datos.buscarTarjeta(peticion) != null)
                            {
                                if (validarTarjeta(peticion))
                                {
                                    streamWriter.WriteLine("O");
                                }
                                else
                                    streamWriter.WriteLine("N");
                            }
                        }

                        else if (operacion == "M")
                        {
                            cambiarClave(peticion);
                        }

                        else if (operacion == "H")
                        {
                            String cuentas = informacionCuentas(peticion);
                            streamWriter.WriteLine(cuentas);
                        }
                        
                        streamWriter.Flush();

                        Console.WriteLine("Cliente dice : " + peticion);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }

                    finally
                    {
                        streamReader.Close();
                        streamWriter.Close();
                        networkStream.Close();
                        socketParaCliente.Close();
                    }

                }

            }

        }

    }
}
